// plugins/fetchInterceptor.ts
import { defineNuxtPlugin, useRuntimeConfig } from '#app';
import { $fetch, type FetchOptions } from 'ofetch';
// 统一的错误处理函数
// 修改 handleError 函数，返回一个布尔值表示是否已处理

export default defineNuxtPlugin((nuxtApp) => {
    const config = useRuntimeConfig();
    const router = useRouter();
    const baseUrl = config.public.baseUrl || '';
    // 在插件初始化时获取 authToken
    const authToken = useCookie('X-Auth-Token')
    const handleError = async (status: number, router: any) => {
        const errorMessages: Record<number, string> = {
            400: '错误请求',
            401: '未授权，请重新登录',
            403: '禁止访问',
            404: '请求的资源不存在',
            408: '请求超时',
            500: '链接服务器失败',
            502: '网关错误',
            503: '服务不可用',
            504: '网关超时',
            5: '服务器出错'
        };

        if (status === 401) {
            if (import.meta.client) {
                authToken.value = null;
                await router.push('/login');
            }
            return; // 不处理 SSR 的 token 状态清理

        }

        // 其他错误状态的处理
        if (import.meta.client && errorMessages[status]) {
            $message(errorMessages[status], 'warning');
        }
    };

    // 统一的请求配置
    const createFetchOptions = (withToken: boolean, options: any = {}) => {
        return {
            ...options,
            headers: {
                ...options.headers,
                ...(withToken && authToken.value ? { 'X-Auth-Token': authToken.value } : {}),
            },
        };
    };

    // 创建自定义的 $fetch 实例
    const customFetch = $fetch.create({
        baseURL: baseUrl,
        timeout: 10000, // 10秒超时
        onRequest({ options }) {
            const isLoading = (options as any).isLoading ?? true;
            const withToken = (options as any).withToken ?? true;
            Object.assign(options, createFetchOptions(withToken, options));
        },

        onResponse({ response }) {
            if (response._data.code === 5) {
                handleError(response._data.code, router);
            }
            return response._data;
        },
        onRequestError({ error }) {

            if (error) {
                handleError(500, router);
            }
        },
        onResponseError({ error }) {

            throw error;
        },
    });

    // 将自定义的 fetch 实例提供到全局
    nuxtApp.provide('customFetch', customFetch);
    // 提供 useCustomFetch 函数包装 useFetch
    nuxtApp.provide('useCustomFetch', (url: string, options?: FetchOptions<any>) => {
        const withToken = (options as any)?.withToken ?? true;

        // 创建基础配置
        const fetchOptions = {
            baseURL: baseUrl,
            timeout: 9000000,
            ...options,  // 保留原始选项
            ...createFetchOptions(withToken, options),
        };
        return useFetch(url, {
            ...fetchOptions,
            onRequest({ options }) {
                // 使用之前保存的 isLoading 值

            },
            onRequestError({ error }) {
                if (error) {
                    handleError(500, router);
                    throw error;
                }
            },
            onResponseError({ response }) {
                handleError(response.status as number, router);
            },
            onResponse({ response }) {
                const data = response._data;

                // 统一错误处理
                if (data.code === 5) {
                    handleError(data.code, router);
                }
                // 仅在客户端显示 300 错误消息
                if (data.code === 300 && import.meta.client) {
                    $message(data.desc, 'warning');
                }
                return data;
            }
        });
    });
});
